#include <stdint.h>
#include "tiposFileSystem.h"

#ifndef LIBFILESYSTEM_H_
#define LIBFILESYSTEM_H_

void parsearDir(char*, char**);

void sacarNombreDeRuta(char*, char**);

void parsearNomSinExtension(char*, char**);

void parsearExtension(char*, char**);

//MANEJO DE SECTORES
int8_t leerBootSector(void);

//MANEJO DE BLOQUES
int8_t leerBloque(uint64_t, char*);

int8_t escribirBloque(uint64_t, char*);

//MANEJO DE ARCHIVOS
int64_t leerArchivo(char*, char**, infoArchivoODirectorio*, off_t, size_t);

uint16_t obtenerTime();

uint16_t obtenerDate();

int8_t leerContenidoArchivo(nodoCluster**, nodoCluster**, char*, uint32_t);

uint8_t esArchivo(uint8_t);

uint8_t puedoEscribir(uint8_t);

//MANEJO DE ARCHIVOS Y DIRECTORIOS
int8_t buscarInfoPathDesdeRaiz(char*, infoArchivoODirectorio*);

int8_t buscarInfoPathNoDesdeRaiz(char*, infoArchivoODirectorio*);

uint32_t deInfoANumCluster(infoArchivoODirectorio);

//MANEJO DE CLUSTERS
int8_t leerCluster(uint32_t, char*);

int8_t tieneSiguienteCluster(uint32_t);

//MANEJO DE COLAS DE CLUSTERS
int8_t obtenerCadenaClusters(uint32_t, nodoCluster**, nodoCluster**);

int8_t encolarCluster(nodoCluster**, nodoCluster**, uint32_t);

int8_t desencolarCluster(nodoCluster**, nodoCluster**, uint32_t*);

int8_t desencolarClusterFinal(nodoCluster**, nodoCluster**, uint32_t*);

uint16_t tamanioColaClusters(nodoCluster*, nodoCluster*);

/*//MANEJO DE COLA DE ARCHIVOS Y DIRECTORIOS
int8_t encolarDirOArch(t_nodoDirOArch**, t_nodoDirOArch**, char*);

int8_t obtenerColaDirectorios(t_nodoDirOArch**, t_nodoDirOArch**, char*);*/

//MANEJO DE DIRECTORIOS
int8_t leerDirectorio(nodoCluster**, nodoCluster**, t_registroDirectorio**);

int64_t buscarEnDirectorio(t_registroDirectorio*, infoArchivoODirectorio*, uint16_t);

int64_t buscarYModificarDirectorio(t_registroDirectorio*, infoArchivoODirectorio*, uint16_t);

int8_t borrarFilaDirectorio(t_registroDirectorio*, infoArchivoODirectorio*, uint16_t);

int8_t escribirTablaDirectorio(nodoCluster**, nodoCluster**,t_registroDirectorio*);

int8_t mayorCantRegDirConsecutivos(t_registroDirectorio*, uint32_t, uint32_t*, uint32_t*);

uint8_t esSubdirectorio(uint8_t);

//MANEJO DE PILA DE LONG FILE NAME
void apilarLongFileName(nodoLongFileName**, t_longFileName);

void desapilarLongFileName(nodoLongFileName**, t_longFileName*);

uint8_t tamanioPilaLongFileName(nodoLongFileName*);

void vaciarPilaLongFileName(nodoLongFileName**);

//MANEJO DE LONG FILE NAME
void obtenerNombreLongFileName(nodoLongFileName*, char*);

void guardarLongFileNameEnRegComun(t_longFileName, t_registroDirectorio*);

void deRegDirALongFileName(t_registroDirectorio, t_longFileName*);

uint8_t esLongFileName(uint8_t);

//MANEJO DE LA FAT REGION Y TABLA FAT
int8_t leerFatRegion(void);

int8_t leerTablaFat(uint32_t**);

int8_t escribirTablaFat(uint32_t*);

int8_t modificarTablaFat(nodoCluster**, nodoCluster**, uint32_t);

uint32_t obtenerClusterLibre();

int8_t leerSegundaTablaFat(uint32_t**);

int8_t escribirSegundaTablaFat(uint32_t*);

uint32_t cantidadClustersOcupados(void);

uint8_t estaOcupadoCluster(uint32_t);

uint32_t cantidadClustersLibres(void);

int8_t habilitarClusters(nodoCluster**, nodoCluster**);

uint8_t estaLibreCluster(uint32_t);

//MANEJO DE COMANDOS DE LA CONSOLA
int8_t esSalir(char*);

int8_t esFsinfo(char*);

int8_t esFinfo(char*);

int8_t esAyuda(char*);

int8_t esInfoCache(char*);

//MANEJO DE ARGV

int8_t esImprimirDebug(char*);

int8_t esNoUsarFuse(char*);

int8_t esNoUsarSockets(char*);

int8_t esArgumentoPropio(char*);

void parsearArgumentoPropio(char*);

void parsearArgV(char***);

#endif /* LIBFILESYSTEM_H_ */
